package controller

import (
	"github.com/kataras/iris/v12"
	"github.com/spf13/cast"
	"strings"
	"wit-admin-go/system/app/dto"
	"wit-admin-go/system/app/model"
	"wit-admin-go/system/app/service"
	"wit-admin-go/system/utils"
	log "wit-admin-go/system/zaplogger"
)

type ApisController struct {
}

var Apis = new(ApisController)
var app = utils.Wit

// GetApisById
//
//	@Tags		apis
//	@Summary	通过id获取接口信息
//	@accept		x-www-form-urlencoded
//	@Produce	x-www-form-urlencoded
//	@Param		id	query	string	true	"apis id"
//	@Success	200
//	@Router		/apis/getApisById [get]
//
// @Security ApiKeyAuth
func (us *ApisController) GetApisById(ctx iris.Context) {
	res := new(dto.Result)
	id := ctx.URLParam("id")
	if id == "" {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusBadRequest, "缺少参数id"))
		return
	}

	apis, err := service.ApisService.GetApisById(id)
	if err != nil {
		res.Code = iris.StatusNotFound
		res.Msg = "数据没找到"
	} else {
		res.Code = iris.StatusOK
		res.Data = apis
		res.Msg = "请求成功"
	}
	_ = ctx.JSON(res)
}

// CreateApis  添加接口
//
//	@Summary		添加接口
//	@Description	添加接口
//	@Tags			apis
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			path		query	string	true	"路径"
//	@Param			name		query	string	true	"接口名"
//	@Param			groupName	query	string	true	"接口组"
//	@Param			method		query	string	true	"方法"
//	@Param			memo		query	string	false	"备注"
//	@Success		200
//	@Router			/apis/createApis [post]
//
// @Security ApiKeyAuth
func (us *ApisController) CreateApis(ctx iris.Context) {
	res := new(dto.Result)
	apis := new(dto.Apis)
	apis.Id = utils.GetUid()
	apis.CreateId = GetUser(ctx).Id
	err := ctx.ReadForm(apis)
	if err != nil {
		log.Log.Error(cast.ToString(err))
		res.Code = iris.StatusBadRequest
		res.Msg = cast.ToString(err)
		_ = ctx.JSON(res)
		return
	}
	err = service.ApisService.PostCreateApis(*apis)
	if err != nil {
		res.Code = iris.StatusInternalServerError
		res.Msg = err.Error()
	} else {
		res.Code = iris.StatusOK
		res.Msg = "创建成功"
	}
	_ = ctx.JSON(res)
}

// UpdateApis  修改接口
//
//	@Summary		修改接口
//	@Description	修改接口
//	@Tags			apis
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			id			query	string	true	"ID"
//	@Param			path		query	string	false	"路径"
//	@Param			name		query	string	false	"接口名"
//	@Param			groupName	query	string	false	"接口组"
//	@Param			method		query	string	false	"方法"
//	@Success		200
//	@Router			/apis/updateApis [put]
//
// @Security ApiKeyAuth
func (us *ApisController) UpdateApis(ctx iris.Context) {
	res := new(dto.Result)
	apis := new(dto.Apis)
	apis.UpdateId = GetUser(ctx).Id
	err := ctx.ReadForm(apis)
	if err != nil {
		log.Log.Error(cast.ToString(err))
		res.Code = iris.StatusBadRequest
		res.Msg = cast.ToString(err)
		_ = ctx.JSON(res)
		return
	}
	err = service.ApisService.PutUpdateApis(*apis)
	if err != nil {
		res.Code = iris.StatusNotFound
		res.Msg = err.Error()
	} else {
		res.Code = iris.StatusOK
		res.Msg = "修改成功"
	}
	_ = ctx.JSON(res)
}

// GetList 获取所有接口
//
//	@Summary		获取接口信息
//	@Description	获取接口信息
//	@Tags			apis
//	@Param			pageNum		query	int		false	"页码"
//	@Param			pageSize	query	int		false	"每页数"
//	@Param			name		query	string	false	"接口名"
//	@Param			groupName	query	string	false	"接口组"
//	@Param			method		query	string	false	"方法"
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Success		200
//	@Router			/apis/getApisList [get]
//
// @Security ApiKeyAuth
func (us *ApisController) GetList(ctx iris.Context) {
	res := new(dto.Result)
	page := new(dto.ApisPage)
	if err := ctx.ReadForm(page); err != nil {
		res.Code = iris.StatusBadRequest
		res.Msg = "参数错误"
		_ = ctx.JSON(res)
		return
	}
	apis, total := service.ApisService.GetApisList(page)
	res.Data = apis
	res.Msg = "请求成功"
	res.Code = iris.StatusOK
	// Header返回总条数
	utils.SetTotal(ctx, total)
	_ = ctx.JSON(res)
}

// DeleteApis 删除接口
//
//	@Summary		删除接口
//	@Description	删除接口
//	@Tags			apis
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			id	query	string	true	"apis id"
//	@Success		200
//	@Router			/apis/deleteApis [delete]
//
// @Security ApiKeyAuth
func (us *ApisController) DeleteApis(ctx iris.Context) {
	res := new(dto.Result)
	id := ctx.URLParam("id")
	if id == "" {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusBadRequest, "缺少参数id"))
		return
	}

	err := service.ApisService.DelApis(id, GetUser(ctx).Id)
	if err != nil {
		res.Code = iris.StatusNotFound
		res.Msg = err.Error()
	} else {
		res.Code = iris.StatusOK
		res.Msg = "删除成功"
	}
	_ = ctx.JSON(res)
}

// RemoveApis 永久删除接口
//
//	@Summary		永久删除接口
//	@Description	永久删除接口
//	@Tags			apis
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			id	query	string	true	"apis id"
//	@Success		200
//	@Router			/apis/removeApis [delete]
//
// @Security ApiKeyAuth
func (us *ApisController) RemoveApis(ctx iris.Context) {
	res := new(dto.Result)
	id := ctx.URLParam("id")
	if id == "" {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusBadRequest, "缺少参数id"))
		return
	}

	err := service.ApisService.RemoveApis(id)
	if err != nil {
		res.Code = iris.StatusNotFound
		res.Msg = err.Error()
	} else {
		res.Code = iris.StatusOK
		res.Msg = "删除成功"
	}
	_ = ctx.JSON(res)
}

// SynApis 同步数据
//
//	@Summary		同步Api数据
//	@Description	同步Api数据
//	@Tags			apis
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Success		200
//	@Router			/apis/synApis [get]
//
// SynApis 同步数据
func (us *ApisController) SynApis(ctx iris.Context) {
	R := app.GetRoutesReadOnly()
	var apis = new(model.Apis)
	var api = new([]model.Apis)
	for _, r := range R {
		if r.Method() != "OPTIONS" && r.Path() != "/wit/{any:path}" {
			apis.Name = r.Name()
			apis.Method = r.Method()
			apis.GroupName = strings.SplitN(strings.TrimLeft(r.Path(), "/wit/"), "/", -1)[0]
			apis.Path = r.Path()
			apis.Id = utils.GetUid()
			rows := utils.DB.Where("path = ?", r.Path()).Find(&api).RowsAffected
			if rows == 0 {
				err := utils.DB.Create(&apis).Error
				if err == nil {
					log.Log.Infof(`%s ====> 同步成功`, apis.Path)
				}
			}
		}
	}
	_ = ctx.JSON(dto.NewResult(nil, iris.StatusOK, "同步成功"))
}
